package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;


import java.util.Date;
import java.util.List;
import java.util.Map;

import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.calendar.OffDayInfoVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.calendar.WorkingDayAndOffDayAddVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.calendar.WorkingDayInfoVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.calendar.WorkingDayQueryVo;

/**
 * @author wuliepeng
 * @date 2019-07-18
 */
public interface WorkingDayRepository {

    /**
     * 工作日设置新增或更新
     *
     * @param workingDayAndOffDayAddVo
     * @return
     */
    void addWorkingDay(WorkingDayAndOffDayAddVo workingDayAndOffDayAddVo);

    /**
     * 工作日设置列表查询
     *
     * @return
     */
    List<WorkingDayInfoVo> listWorkingDay();

    /**
     * 获取节假日和例外设置信息列表
     *
     * @param workingDayQueryVo
     * @return
     */
    List<OffDayInfoVo> listOffDayAndException(WorkingDayQueryVo workingDayQueryVo);

    /**
     * 判断是否超时, 判断(end - start)是否长于duration
     * 需要考虑时间段内的休息日和例外日期
     *
     * @param start    起始日期
     * @param end      结束日期
     * @param duration 超时时长
     * @return
     */
    Boolean isTimeout(Date start, Date end, Long duration);

    /**
     * 判断是否超时, 判断(end - start)是否长于duration
     * 需要考虑时间段内的休息日和例外日期
     *
     * @param start       起始日期
     * @param end         结束日期
     * @param workingDays 工作日
     * @param plusDays    例外日期(可以理解为加班)
     * @param offDays     节假日
     * @param duration    超时时长
     * @return
     */
    Boolean isTimeout(Date start, Date end, List<String> workingDays, List<String> plusDays, List<String> offDays, Long duration);

    /**
     * 获取工作日列表(以周为维度,每周的工作日)
     *
     * @return
     */
    List<String> getWorkingDays();

    /**
     * 获取某个时间段内的节假日和例外日期(可以理解为加班)列表
     *
     * @param start 起始日期
     * @param end   结束日期
     * @return
     */
    Map<String, List<String>> getOffDayAndPlusDay(Date start, Date end);
}
